package tech.aistar.corejava.day07;

/**
 * @Author:         lya
 * @Description:   本类的作用描述:JVM加载类进内存的活动过程
 *  JVM通过类加载器加载类进内存.
 *  立即给静态属性分配空间以及初始化:(先给父类的属性分配空间,后给子类的属性分配空间)
 *  立即给静态方法分配空间以及初始化:(先给父类的方法分配空间,后给子类的方法分配空间)
 *  会给静态代码块分配空间以及初始化
 *  调用静态代码块
 *  如果创建了对象new
 *      会给所有的非静态属性分配空间以及初始化
 *      会给所有的非静态方法分配空间以及初始化
 *      调用普通代码块
 *      调用构造块
 * @param 
 * @return:         
 * @CreateDate:    2019/7/23 14:42
 * @Version:       1.0
*/
public class JVMLoadingActiveProcessesIntoClassMemory {
    //非静态属性
    private int id = 10;
    //静态属性
    private static int sid = 100;

    //构造块
    public JVMLoadingActiveProcessesIntoClassMemory(){
        System.out.println("构造块!");
        System.out.println("构造块_id:"+id);
        System.out.println("构造块_sid:"+sid);
    }

    //普通代码块
    {
        System.out.println("普通代码块!");
        System.out.println("普通代码块_id:"+id);
        System.out.println("普通代码块_sid:"+sid);
    }

    //静态代码块 - JVM加载类进内存的时候 - 会优先给静态代码分配空间
    //和初始化 - 并且初始换时机仅仅只有一次
    static {
        System.out.println("静态代码块!");
        //不能使用非静态属性
        //System.out.println("静态代码块_id:"+id);
        System.out.println("静态代码块_sid:"+sid);
    }

    public static void main(String[] args) {
        JVMLoadingActiveProcessesIntoClassMemory j1 = new JVMLoadingActiveProcessesIntoClassMemory();
        JVMLoadingActiveProcessesIntoClassMemory j2 = new JVMLoadingActiveProcessesIntoClassMemory();
    }
/*  运行结果:
    静态代码块!
    静态代码块_sid:100
    普通代码块!
    普通代码块_id:10
    普通代码块_sid:100
    构造块!
    构造块_id:10
    构造块_sid:100
    普通代码块!
    普通代码块_id:10
    普通代码块_sid:100
    构造块!
    构造块_id:10
    构造块_sid:100*/
}
